import {useConsoleStore, useSocketStore} from '../store';


function initWS(option) {
    const consoleStore = useConsoleStore();
    const socketStore = useSocketStore();
    // 保存传入的conosle信息
    const saveConsole = consoleStore.saveConsole;


    // 建立 WebSocket 连接
    const {port} = option;
    console.log(port);
    let socket = null;
    const wsUrl = `ws://localhost:${port}`;
    let connected = false;
    let tt = null;

    // 创建ws连接
    const createWebSocket = wsUrl => {
        try {
        // 成功
            socket = new WebSocket(wsUrl);
            // console.log(socketStore.updateSocket);
            socketStore.updateSocket(socket);
            webSocketInit();// 初始化webSocket连接函数
        } catch (e) {
        // 失败
            console.log('catch', e);
            // 重连
            // 重连函数
            webSocketReconnect(wsUrl);
        }
    };

    // 初始化方法，成功后执行
    const webSocketInit = function () {
    // 连接关闭函数
        socket.onclose = function () {
            console.log('连接已关闭...');
            connected = false;
            // 关闭心跳检测
            heartCheck.stop();
            webSocketReconnect(wsUrl);// 如果连接关闭则重连
        };
        // 连接错误函数
        socket.onerror = function () {
            console.log('连接错误...');
            connected = false;
            // 关闭心跳检测
            heartCheck.stop();
            webSocketReconnect(wsUrl);// 如果连接错误则重连
        };
        // 连接建立,发送信息
        socket.onopen = function () {
            connected = true;
            // console.log(`${wsUrl}连接成功`)
            console.log('连接node成功');
            const helloMessage = {
                ModeCode: 'hello',
                message: 'hello,this is client'
            };
            socket.send(JSON.stringify(helloMessage));
        };
        socket.onmessage = function (evt) {
            let data = evt.data;
            try {
                data = JSON.parse(data);
            } catch {
                data = {ModeCode: 'fail', ...data};
            }
            const {ModeCode} = data;
            switch (ModeCode) {
                case 'heart_beat':
                    console.log('心跳返回');
                    break;
                case 'console':
                    saveConsole(data);
                    break;
                case 'error':
                    saveConsole(data);
                    break;
                default:
                // 接收一次后台推送的消息，即进行一次心跳检测重置
                    heartCheck.reset();
                    break;
            }

        };
    };

    // 封装为键值对的形式，成为js对象，与json很相似
    const heartCheck = {
        timeout: 30000, // 30秒
        timeoutObj: 'null1',
        heartBeatCount: 0,
        reset: function () {// 接收成功一次推送，就将心跳检测的倒计时重置为30秒
            clearTimeout(this.timeoutObj);// 重置倒计时
            // this.heartBeatCount = 0
            this.start();
        },
        start: function () {// 启动心跳检测机制，设置倒计时30秒一次
            this.timeoutObj = setTimeout(() => {
                this.heartBeatCount += 1;

                const message = {
                    ModeCode: 'heart_beat',
                    'type': 't10010',
                    'service': '运行心跳业务一次 ==' + new Date(),
                    times: this.heartBeatCount
                };

                console.log(`心跳${this.heartBeatCount}次`);
                socket.send(JSON.stringify(message));
                this.start(); // 启动心跳
            }, this.timeout);
        },
        stop: function () {
            clearTimeout(this.timeoutObj);
            this.timeoutObj = null;
            this.heartBeatCount = 0;
            console.log('心跳检测已停止');
        }
    // onopen连接上，就开始start及时，如果在定时时间范围内，onmessage获取到了服务端消息，
    // 就重置reset倒计时，距离上次从后端获取消息30秒后，执行心跳检测，看是不是断了。
    };

    // 重新连接
    const webSocketReconnect = url => {
        if (connected) {
            return;
        }
        // 重新连接对；stackList 的处理
        consoleStore.stackList = [];

        console.log('socket 连接断开，正在尝试重新建立连接');
        // 没连接上会一直重连，设置延迟，避免请求过多

        tt && clearTimeout(tt);
        tt = setTimeout(() => {
            console.log('重新连接');
            createWebSocket(url);
        }, 100);
    };


    createWebSocket(wsUrl);
    return socket;
}


export {
    initWS
};


